﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using VideoLink.Frames;

namespace VideoLink.Streams
{
    /// <summary>
    /// Базовый класс для всех приёмников видео.
    /// Предоставляет базовый функционал, пользовательские элементы управления.
    /// </summary>
    public partial class VideoReceiverBase : UserControl
    {
        #region Protected fields

        /// <summary>
        /// Иконка, которая будет рисоваться в заголовке потока при State = Stop
        /// </summary>
        protected Bitmap stopIcon = VideoLink.Properties.Resources.Stop;
        /// <summary>
        /// Иконка, которая будет рисоваться в заголовке потока при State = Play
        /// </summary>
        protected Bitmap playIcon = VideoLink.Properties.Resources.Play;
        /// <summary>
        /// Иконка, которая будет рисоваться в заголовке потока при State = Pause
        /// </summary>
        protected Bitmap pauseIcon = VideoLink.Properties.Resources.Pause;
        
        #endregion

        #region Properties

        /// <summary>
        /// Текущее состояние процесса воспроизведения.
        /// Изменяется при получении нового пакета с информацией о потоке
        /// (NewFrameReceived).
        /// </summary>
        public PlaybackState State { get; protected set; }

        /// <summary>
        /// ID потока, уникален среди всех потоков
        /// </summary>
        public int StreamID { get; private set; }

        /// <summary>
        /// Имя файла, который воспроизводится источником данного потока.
        /// </summary>
        public virtual string FileName
        {
            get { return fileNameL.Text; }
            protected set { fileNameL.Text = value; }
        }

        /// <summary>
        /// Панель, на которой можно размещать компоненты, отображающие видео.
        /// </summary>
        protected Panel ViewportPanel
        {
            get
            {
                return splitContainer.Panel2;
            }
        }
        
        #endregion

        /// <summary>
        /// Создать новый экземпляр класса по умолчанию
        /// </summary>
        public VideoReceiverBase()
        {
            InitializeComponent();
            statePB.SizeMode = PictureBoxSizeMode.StretchImage;
            statePB.Image = stopIcon;
        }

        /// <summary>
        /// Создать новый экземпляр класса с указаным ID потока
        /// </summary>
        /// <param name="streamID">
        /// ID потока, уникален среди всех потоков.
        /// </param>
        public VideoReceiverBase(int streamID)
            : this()
        {
            StreamID = streamID;
        }
        
        #region Public methods

        /// <summary>
        /// Обработчик получения нового пакета с информацией о потоке.
        /// В данной реализации изменяет State на указанное в пакете.
        /// </summary>
        /// <param name="frame">
        /// Информация о потоке.
        /// </param>
        public virtual void NewFrameReceived(VideoStreamState frame)
        {
            fileNameL.Text = frame.StreamID.ToString();

            if (State != frame.State)
                switch (frame.State)
                {
                    case PlaybackState.Play:
                        statePB.Image = playIcon;
                        break;
                    case PlaybackState.Stop:
                        statePB.Image = stopIcon;
                        break;
                    case PlaybackState.Pause:
                        statePB.Image = pauseIcon;
                        break;
                }

            State = frame.State;
        }

        /// <summary>
        /// Подготовить приёмник к закрытию.
        /// </summary>
        public virtual void Close()
        {

        }
        
        #endregion

        #region Private methods

        /// <summary>
        /// Обработчик события клика кнопки закрытия приёмника.
        /// </summary>
        /// <param name="sender">-</param>
        /// <param name="e">-</param>
        private void closeB_Click(object sender, EventArgs e)
        {
            Close();
            if (NeedClose != null)
                NeedClose(this, EventArgs.Empty);
        }
        
        #endregion

        #region Events

        /// <summary>
        /// Вызывается при клике кнопки закрытия приёмника на контроле.
        /// </summary>
        public event EventHandler NeedClose;
        
        #endregion
    }
}
